/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package redeneural;



import java.util.ArrayList;
import java.util.Iterator;
import javax.swing.JOptionPane;
import javax.swing.JTextArea;
import weka.core.*;

/**
 *
 * @author Sanches
 */
public class ClassificarInstancia {

    private Treinamento ini;
    String texto = "";

    public ClassificarInstancia(Treinamento ini){
        this.ini = ini;
     
        
    }


    public String classificarUmaInstancia() throws Exception{

      int aux = 0;

        if (ini.getRedeNeural() == null) {
            JOptionPane.showMessageDialog(null, "Rede Neural Não Treinada!");
        } else {

            // Agora podemos preencher a relação com instâncias .
            Instance i1 = new Instance(ini.getInstancia().numAttributes());

          for (int i = 0; i < ini.getInstancia().numAttributes() - 1; i++) {
               int type = ini.getInstancia().attribute(i).type();
               switch (type){
               case Attribute.NUMERIC:
                        i1.setValue(i, Double.parseDouble(JOptionPane.showInputDialog("Numerico " + ini.getInstancia().attribute(i).name() + ": ")));
                        break;

                case Attribute.NOMINAL:
                        aux = 0;
                       do {
                            String dado = JOptionPane.showInputDialog("Nominal " + ini.getInstancia().attribute(i).name() + ": ");

                            for (int e = 0; e < ini.getInstancia().attribute(i).numValues(); e++) {
                                if (dado.equalsIgnoreCase(ini.getInstancia().attribute(i).value(e))) {
                                    i1.setValue(i, e);
                                    aux++;
                                    break;
                                }

                            }

                        } while (aux == 0);
                        break;

               case Attribute.STRING:
                        aux = 0;

                        do {
                            String dado = JOptionPane.showInputDialog("String " + ini.getInstancia().attribute(i).name() + ": ");

                            for (int e = 0; e < ini.getInstancia().attribute(i).numValues(); e++) {
                                if (dado.equalsIgnoreCase(ini.getInstancia().attribute(i).value(e))) {
                                    i1.setValue(i, e);
                                    aux++;
                                    break;
                                }

                            }

                        } while (aux == 0);
                        break;


               case Attribute.RELATIONAL:



                        i1.setValue(i, Double.parseDouble(JOptionPane.showInputDialog("Relacional " + ini.getInstancia().attribute(i).name() + ": ")));
                        break;


                }

            }// fim do for


            ini.getInstancia().add(i1);



            // Agora vamos classificarUmaInstancia cada dado com esta rede .
            Instance instância = ini.getInstancia().instance(ini.getInstancia().numInstances() - 1);
            // Classificamos esta instância .
            int classe = (int) (ini.getRedeNeural().classifyInstance(instância));

            for (int e = 0; e < ini.getInstancia().attribute(ini.getInstancia().numAttributes() - 1).numValues(); e++) {
                if (classe == e) {
                     texto = texto.concat("\nNome da Relação: " + ini.getInstancia().relationName() +
                  "\n" +"Atributos: " + ini.getInstancia().numAttributes() + "\n\n" +
                   "A instancia foi classificada na Classe '" + ini.getInstancia().attribute(ini.getInstancia().numAttributes() - 1).name() +
                    "' como:   " + ini.getInstancia().attribute(ini.getInstancia().numAttributes() - 1).value(e));
                }

            }

               return texto;
        }// fim do else
         return "Erro!!  A instancia nao foi classificada em nenhuma das classe";
    }// fim do metodo






     public String classificarAll( ArrayList<String> result) throws Exception{

     int aux = 0;

        if(ini.getRedeNeural() == null) {
            JOptionPane.showMessageDialog(null, "Rede Neural Não Treinada!");
        }else {
       Iterator it = result.iterator();

         do{
         
            // Agora podemos preencher a relação com instâncias .
            Instance i1 = new Instance(ini.getInstancia().numAttributes());
         
          for (int i=0; i < ini.getInstancia().numAttributes(); i++) {
               int type = ini.getInstancia().attribute(i).type();
               switch (type){
               case Attribute.NUMERIC:
                        i1.setValue(i, Double.parseDouble(result.get(aux)));
                        aux++;
                        it.next();
                        break;

                case Attribute.NOMINAL:
             
                            String dado = result.get(aux);

                            for (int e = 0; e < ini.getInstancia().attribute(i).numValues(); e++) {
                                if (dado.equalsIgnoreCase(ini.getInstancia().attribute(i).value(e))) {
                                    i1.setValue(i, e);
                                    aux++;
                                    it.next();
                                    break;
                                }

                            }// fim do for

                     
                        break;

               case Attribute.STRING:
                    
                            String dados = result.get(aux);

                            for (int e = 0; e < ini.getInstancia().attribute(i).numValues(); e++) {
                                if (dados.equalsIgnoreCase(ini.getInstancia().attribute(i).value(e))) {
                                    i1.setValue(i, e);
                                    it.next();
                                    aux++;
                                    break;
                                }

                            }// fim do for

                    
                        break;


               case Attribute.RELATIONAL:
                        i1.setValue(i, Double.parseDouble(result.get(aux)));
                        aux++;
                        it.next();
                        break;


                }

            }// fim do for
           

            ini.getInstancia().add(i1);

            // Agora vamos classificarUmaInstancia cada dado com esta rede .
            Instance instância = ini.getInstancia().instance(ini.getInstancia().numInstances()-1);
     
            // Classificamos esta instância .
            double classe = (int) (ini.getRedeNeural().classifyInstance(instância));

            for (int e = 0; e < ini.getInstancia().attribute(ini.getInstancia().numAttributes() - 1).numValues(); e++) {     
                if (classe == e) {

                  texto = texto.concat("\nNome da Relação: " + ini.getInstancia().relationName() +
                  "\n" +"Atributos: " + ini.getInstancia().numAttributes() + "\n\n" +
                   "A instancia foi classificada na Classe '" + ini.getInstancia().attribute(ini.getInstancia().numAttributes() - 1).name() +
                    "' como:   " + ini.getInstancia().attribute(ini.getInstancia().numAttributes() - 1).value(e)+"\n");

                }

            }


 } while(it.hasNext());// fim do while

       return texto;

        }// fim do else

        return "Erro!!  A instancia nao foi classificada em nenhuma das classe";

    }// fim do metodo
}
